package com.woniuxy.test.factory;

import com.woniuxy.test.MyTest;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

//第一版本Bean工厂，Bean你们把它理解为对象就行，spring核心的就是bean
//第一个版本的 low版工厂  没有高内聚低耦合，耦合很高
public class BeanFactory {
    static String name;//全限定类名
    static Map<String,Object> map;
    static {
        //1.读取配置文件 ./表示当前文件MyTest.java文件所在文件夹   ../表示当前文件上一级目录
        InputStream resourceAsStream = MyTest.class.getResourceAsStream("../../../bean.properties");
        //2.创建一个解析properties文件的对象 用来解析获取到的文件流
        Properties properties = new Properties();
        //3.从输入流中读取到配置文件的信息
        try {
            properties.load(resourceAsStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
        //需求，在读取配置文件的时候，直接获取到所有的内容，然后封装起来装入 数据结构中
        Set<Object> keys = properties.keySet();//这里已经获取到所有的key
        map = new HashMap();
        for (Object key : keys) {
            System.out.println(key);
            Object value = properties.get(key);//每个key所对应的value
            //key放入某个集合中  value也放入某个集合  用list 还是 map集合
            try {
                Class<?> aClass = Class.forName(value + "");
                Object o = aClass.newInstance();//实例化对象
                map.put((String) key,o);//key和对应的实例化好的对象放进去
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        System.out.println(map);
        //5.通过配置文件实现了解耦，以后，代码是不需要去改变，顶多新增一个类
        //这里传入我配置文件中写入的value，拿到全限定类名
    }
    //传入某个东西，返回你一个对象
    /**
     * @todo: 通过工厂，来动态创建对象
     * @param name name是key的名称
     * @return  对应的对象
     */
    public Object getBean(String name){
        //try catch 是内部异常处理，出问题了 要怎么办  内部处理就好了
        Object o = map.get(name);
        return o;
    }
}
